import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.awt.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

class hiddenWebClassification 
{
        static XPathFactory factory = null;
        static XPath xpath = null;
        static XPathExpression expr = null;
        static String userSite = null;
        static ArrayList<String> classificationQ = new ArrayList<String>();
        static Map<String, ArrayList<String>> classesQ= new HashMap<String, ArrayList<String>>();
        static Map<String, ArrayList<String>> classes= new HashMap<String, ArrayList<String>>();

        public static void initClasses(){
        	classes.put("Root", null);
        	classes.put("Computers", null);
        	classes.put("Hardware", null);
        	classes.put("Programming", null);
        	classes.put("Sports", null);
        	classes.put("Basketball", null);
        	classes.put("Soccer", null);
        	classes.put("Health", null);
        	classes.put("Fitness", null);
        	classes.put("Disease", null);
        	
        	classificationQ.add("avi file");
        	classificationQ.add("java and python");
        	classificationQ.add("motherboard");
        	classificationQ.add("football and soccer");
        	classificationQ.add("Micheal Jordan");
        	classificationQ.add("Messi");
        	classificationQ.add("health");
        	classificationQ.add("cancer");
        	classificationQ.add("fitness");
        	
        	
        	
        }
        
        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, 
XPathExpressionException
        {

                String requestURL = BuildRequest();


                Document doc = GetResponse(requestURL);

                if(doc != null)
                {
                        DisplayResponse(doc);
                }

        }
        private static String BuildRequest()
        {
                String AppId = "48231A5D0F1ED59F6D6B94A861758AF829869513";
                String requestString = "http://api.search.live.net/xml.aspx?"

                        // Common request fields (required)
                        + "AppId=" + AppId
                        + "&Query= site:" 
                        + userSite
                        +classificationQ
                        + "&Sources=Web"

                        // Common request fields (optional)
                        + "&Version=2.0"
                        + "&Market=en-us"
                        + "&Adult=Moderate"

                        // Web-specific request fields (optional)
                        + "&Web.Count=10"
                        + "&Web.Offset=0"
                        + "&Web.Options=DisableHostCollapsing+DisableQueryAlterations";

                return requestString;
        }

        private static Document GetResponse(String requestURL) throws ParserConfigurationException, SAXException, 

IOException 
        {
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                dbf.setNamespaceAware(true);
                Document doc = null;
                DocumentBuilder db = dbf.newDocumentBuilder();

                if (db != null)
                {              
                        doc = db.parse(requestURL);
                }

                return doc;
        }

        private static void DisplayResponse(Document doc) throws XPathExpressionException
        {
                factory = XPathFactory.newInstance();
                xpath = factory.newXPath();
                xpath.setNamespaceContext(new APINameSpaceContext());
                NodeList errors = (NodeList) xpath.evaluate("//api:Error",doc,XPathConstants.NODESET);

                if(errors != null && errors.getLength() > 0 )
                {
                        // There are errors in the response. Display error details.
                        DisplayErrors(errors);
                }
                else
                {
                        DisplayResults(doc);
                }
        }

        private static void DisplayResults(Document doc) throws XPathExpressionException 
        {
                String version = (String)xpath.evaluate("//@Version",doc,XPathConstants.STRING);
                String searchTerms = (String)xpath.evaluate("//api:SearchTerms",doc,XPathConstants.STRING);
                //int total = Integer.parseInt((String)xpath.evaluate("//web:Web/web:Total",doc,XPathConstants.STRING));
                //int offset = Integer.parseInt((String)xpath.evaluate("//web:Web/web:Offset",doc,

//XPathConstants.STRING));
                NodeList results = (NodeList)xpath.evaluate("//web:Web/web:Results/web:WebResult",doc,

XPathConstants.NODESET); 

                // Display the results header.
                System.out.println("Live Search API Version " + version);
                System.out.println("Web results for " + searchTerms);
  //              System.out.println("Displaying " + (offset+1) + " to " + (offset + 

//results.getLength()) + " of " + total + " results ");
                System.out.println();

                // Display the Web results.
                StringBuilder builder = new StringBuilder();

                for(int i = 0 ; i < results.getLength(); i++)
                {
                        NodeList childNodes = results.item(i).getChildNodes();

                        for (int j = 0; j < childNodes.getLength(); j++) 
                        {
                                if(!childNodes.item(j).getLocalName().equalsIgnoreCase("DisplayUrl"))
                                {
                                        String fieldName = childNodes.item(j).getLocalName();

                                        if(fieldName.equalsIgnoreCase("DateTime"))
                                        {
                                         //       fieldName = "Last Crawled";
                                        	continue;
                                        }

                                        builder.append(fieldName + ":" + childNodes.item(j).getTextContent());
                                        builder.append("\n");
                                }
                        }

                        builder.append("\n");
                }

                System.out.println(builder.toString());
        }

        private static void DisplayErrors(NodeList errors) 
        {
                System.out.println("Live Search API Errors:");
                System.out.println();

                for (int i = 0; i < errors.getLength(); i++) 
                {
                        NodeList childNodes = errors.item(i).getChildNodes();

                        for (int j = 0; j < childNodes.getLength(); j++) 
                        {
                                System.out.println(childNodes.item(j).getLocalName() + ":" + childNodes.item(j).getTextContent());
                        }

                        System.out.println();
                }
        }
}